﻿using Comm.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace Comm.Web.Action
{
    public abstract class BaseHander : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        protected HttpContext context = null;
        BLL.UserTypeInfoService blluserinfo = new BLL.UserTypeInfoService();
        #region 方便访问 上下文里的 各种属性 Session、Request、Response
        protected HttpSessionState Session
        {
            get
            {
                return context.Session;
            }
        }
        protected HttpRequest Request
        {
            get
            {
                return context.Request;
            }
        }
        protected HttpResponse Response
        {
            get
            {
                return context.Response;
            }
        }
        #endregion

        Model.Users userNow = null;
        Model.UserTypeInfo userType = null;
        #region 1.0 统一的访问 当前登录用户 对象 的属性 + MODEL.Users UserNow
        /// <summary>
        /// 统一的访问 当前登录用户 对象 的属性
        /// </summary>
        public Model.Users UserNow
        {
            get
            {
                if (userNow == null)
                {
                    userNow = Session["current_user"] as Model.Users;
                }
                return userNow;
            }
        }
        #endregion

        #region 2.0 获取当前用户的权限 + Model.UserTypeInfo UserType
        /// <summary>
        /// 获取当前用户的权限
        /// </summary>
        public Model.UserTypeInfo UserType
        {
            get
            {
              IList<Model.UserTypeInfo> list =blluserinfo.getWhereList("");
                foreach(Model.UserTypeInfo model in list)
                {
                    if (model.userId == UserNow.uId) 
                    {
                        userType = model;
                    }
                }
                return userType;
            }
        }
        #endregion

        /// <summary>
        /// 一般处理程序的 入口 方法
        /// </summary>
        public void ProcessRequest(HttpContext context)
        {
            this.context = context;
            //1.验证是否有权限
            if (Session["current_user"] == null)
            {
                //1.1既没有 Session 也没有 cookie 则 判断为没有登录
                if (Request.Cookies["current_user"] == null)
                {
                    //注意：一般处理程序，一般都是 由 Ajax异步对象请求，所以需要生成 json格式字符串返回
                    AjaxMsgHelper.AjaxMsg("np", "您尚未登录~~", null, "../html/login.html");
                    Response.End();//结束代码（子页面的 SonLoad和前台页面 就不会运行了）
                }
                //1.2如果有Cookie，则 读取Cookie中的用户id，并到数据库中读取 用户对象 存入Session
                else
                {
                    //如果Cookie中有用户id,则 根据id读取用户对象 存入 Session
                    string strId = Request.Cookies["current_user"]["UId"];
                    //验证 strId 是否为 整型
                    //验证成功则读取数据库 ， 并将 用户对象 保存到Session
                    userNow = new BLL.UsersService().QuerySingle(int.Parse(strId));
                    Session["current_user"] = userNow;
                }
            }
            //2.调用子类重写的方法 执行 子类的 业务
            SonLoad();
        }

        /// <summary>
        /// 3.提供给子类 必须 重写的 一个 方法
        /// </summary>
        public abstract void SonLoad();


        public bool IsReusable
        {
            get { return false; }
        }
    }
}